package ldh.im.dto.codec.binery;

import io.netty.buffer.ByteBuf;
import ldh.im.dto.base.Message;
import ldh.im.dto.enmus.MessageType;

public abstract class MessageCodec<T extends Message> extends AckToCodec<T> {

    @Override
    public void encode(T message, ByteBuf byteBuf) {
        super.encode(message, byteBuf);
        byteBuf.writeLong(message.getFromUserId());
        byteBuf.writeShort(message.getMessageType().getValue());
        if (message.getBytes() == null) {
            byteBuf.writeShort(0);
        } else {
            byteBuf.writeShort(message.getBytes().length);
            byteBuf.writeBytes(message.getBytes());
        }
    }

    @Override
    public void decode(T message, ByteBuf byteBuf) {
        super.decode(message, byteBuf);
        message.setFromUserId(byteBuf.readLong());
        message.setMessageType(MessageType.getMessageTypeByValue(byteBuf.readShort()));
        short length = byteBuf.readShort();
        if (length != 0) {
            byte[] bytes = new byte[length];
            byteBuf.readBytes(bytes);
            message.setBytes(bytes);
        }
    }
}
